"""
1.什么是闭包
    定义双层嵌套函数， 内层函数可以访问外层函数的变量
    将内存函数作为外层函数的返回，此内层函数就是闭包函数

2.闭包的好处和缺点
    优点：不定义全局变量，也可以让函数持续访问和修改一个外部变量
    优点：闭包函数引用的外部变量，是外层函数的内部变量。作用域封闭难以被误操作修改
    缺点：额外的内存占用

3.nonlocal关键字的作用
    在闭包函数（内部函数中）想要修改外部函数的变量值
    需要用nonlocal声明这个外部变量

"""


# 简单闭包
# def outer(logo):
#
#     def inner(msg):
#         print(f"<{logo}>{msg}<{logo}>")
#
#     return inner
#
#
# fn1 = outer("黑马程序员")
# fn1("大家好")
# fn1("大家好")
#
# fn2 = outer("传智教育")
# fn2("大家好")
# 使用nonlocal关键字修改外部函数的值
# def outer(num1):
#
#     def inner(num2):
#         nonlocal num1
#         num1 += num2
#         print(num1)
#
#     return inner
#
# fn = outer(10)
# fn(10)
# fn(10)
# fn(10)
# fn(10)

# 使用闭包实现ATM小案例
def account_create(initial_amount=0):
    def atm(num, deposit=True):
        nonlocal initial_amount
        if deposit:
            initial_amount += num
            print(f"存款：+{num}， 账户余额：{initial_amount}")
        else:
            initial_amount -= num
            print(f"取款：-{num}， 账户余额：{initial_amount}")

    return atm


atm = account_create()

atm(100)
atm(200)
atm(100, deposit=False)
